Programmable logic devices (PLDs) are a well-known type of general purpose integrated circuit that may be programmed to implement one or more desired circuit designs. One type of PLD, a field programmable gate array (FPGA), typically includes an array of identical configurable logic blocks (CLBs) surrounded by input/output blocks (IOBs). Each CLB may be individually programmed to perform a variety of logic functions. A programmable interconnect selectively connects the CLBs to each other and to the various IOBs to implement complex logic functions and circuits.
To program the PLD to implement a circuit design, a user captures the circuit design using a well-known design capture tool, and then uses well-known software tools to convert the captured design into a device specific bitwise representation. The bitwise representation, commonly referred to as a configuration bitstream, is stored in a non-volatile storage device such as a Programmable Read Only Memory (PROM). Upon power-up, the non-volatile storage device transmits the configuration bitstream to the FPGA, where is loaded into a configuration memory array that controls various switches and multiplexers within the CLBs, IOBs, and programmable interconnect to implement the desired circuit design. Once configured, the FPGA implements the circuit design embodied in the configuration data. For a more detailed description of FPGA architecture, configuration, and operation, refer to The Xilinx 1998 Data Book entitled “The Programmable Logic Data Book”, Chapter 4, available from Xilinx, Inc., and incorporated herein by reference.
The FPGA's configuration memory array is typically a volatile memory such as Static Random Access Memory (SRAM). Thus, when the FPGA is powered off, the configuration data stored in its configuration memory array is lost. Consequently, when the FPGA is again powered up, it must be re-configured using configuration data provided by the non-volatile storage device, as described above.
The non-volatile storage device is typically external to the FPGA not only because of its size and cost but also because of the complexity of its manufacturing process. For example, the manufacturing process of a PROM requires several more masking and deposition steps than that of an SRAM, because while an SRAM uses cross-coupled transistors to store information, a PROM stores information using floating gate transistors, which require an additional layer of polysilicon. Because of the increased manufacturing complexity of non-volatile memory, as compared to volatile memory, the latest processing technology may be available for manufacturing volatile memory as much as a year or more before it is available for manufacturing non-volatile memory. Accordingly, providing the non-volatile memory external to the FPGA allows the FPGA to be manufactured using the latest manufacturing technology, which in turn provides a competitive advantage.
Because creation of the circuit design embodied in the configuration bitstream requires significant time and expense, it is desirable to protect the configuration data from illegal copying by competitors and unauthorized resellers. Unfortunately, the circuit design for an FPGA may be illegally copied by simply copying the configuration bitstream stored in the non-volatile memory. The copied bitstream may then be used to illegally configure other FPGAs, or may be reverse-engineered to extract the circuit design.
To protect against unauthorized copying, the configuration data may be encrypted before it is stored in the non-volatile memory, transmitted to the FPGA in encrypted form, and then decrypted in the FPGA. Thus, in order to copy the circuit design embodied in the configuration data, one must determine the decryption key, thereby making unauthorized copying difficult. However, because the configuration data must be decrypted each time it is received from the external memory during power-up, the FPGA must include a non-volatile memory to store the decryption key. As discussed above, it is not desirable to include non-volatile memory within the FPGA. Accordingly, there is a need for a method of protecting the configuration data when transmitted to the FPGA that does not require a non-volatile memory within the FPGA.